/**
 */
package DentalClinicEMF.clinic.impl;

import DentalClinicEMF.clinic.Appointment;
import DentalClinicEMF.clinic.AppointmentStatus;
import DentalClinicEMF.clinic.BottledProduct;
import DentalClinicEMF.clinic.Client;
import DentalClinicEMF.clinic.ClientType;
import DentalClinicEMF.clinic.ClinicFactory;
import DentalClinicEMF.clinic.ClinicPackage;
import DentalClinicEMF.clinic.DentalClinic;
import DentalClinicEMF.clinic.Dentist;
import DentalClinicEMF.clinic.Product;
import DentalClinicEMF.clinic.Schedule;
import DentalClinicEMF.clinic.Service;

import java.util.HashMap;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EEnum;
import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;

import org.eclipse.emf.ecore.impl.EPackageImpl;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Package</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class ClinicPackageImpl extends EPackageImpl implements ClinicPackage {
	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass dentalClinicEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass clientEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass dentistEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass scheduleEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass appointmentEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass serviceEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass productEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass bottledProductEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum clientTypeEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum appointmentStatusEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EDataType hashMapEDataType = null;

	/**
	 * Creates an instance of the model <b>Package</b>, registered with
	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
	 * package URI value.
	 * <p>Note: the correct way to create the package is via the static
	 * factory method {@link #init init()}, which also performs
	 * initialization of the package, or returns the registered package,
	 * if one already exists.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.emf.ecore.EPackage.Registry
	 * @see DentalClinicEMF.clinic.ClinicPackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private ClinicPackageImpl() {
		super(eNS_URI, ClinicFactory.eINSTANCE);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private static boolean isInited = false;

	/**
	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
	 * 
	 * <p>This method is used to initialize {@link ClinicPackage#eINSTANCE} when that field is accessed.
	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #eNS_URI
	 * @see #createPackageContents()
	 * @see #initializePackageContents()
	 * @generated
	 */
	public static ClinicPackage init() {
		if (isInited) return (ClinicPackage)EPackage.Registry.INSTANCE.getEPackage(ClinicPackage.eNS_URI);

		// Obtain or create and register package
		ClinicPackageImpl theClinicPackage = (ClinicPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof ClinicPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new ClinicPackageImpl());

		isInited = true;

		// Create package meta-data objects
		theClinicPackage.createPackageContents();

		// Initialize created meta-data
		theClinicPackage.initializePackageContents();

		// Mark meta-data to indicate it can't be changed
		theClinicPackage.freeze();

  
		// Update the registry and return the package
		EPackage.Registry.INSTANCE.put(ClinicPackage.eNS_URI, theClinicPackage);
		return theClinicPackage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getDentalClinic() {
		return dentalClinicEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getDentalClinic_EReference0() {
		return (EReference)dentalClinicEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getDentalClinic_ClientList() {
		return (EReference)dentalClinicEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getDentalClinic_DentistList() {
		return (EReference)dentalClinicEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getClient() {
		return clientEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getClient_Name() {
		return (EAttribute)clientEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getClient_Address() {
		return (EAttribute)clientEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getClient_Age() {
		return (EAttribute)clientEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getClient_DeltaID() {
		return (EAttribute)clientEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getClient_ClientType() {
		return (EAttribute)clientEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getClient_EReference0() {
		return (EReference)clientEClass.getEStructuralFeatures().get(5);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getClient_EReference1() {
		return (EReference)clientEClass.getEStructuralFeatures().get(6);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getClient_EReference2() {
		return (EReference)clientEClass.getEStructuralFeatures().get(7);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getClient_PreferredDentist() {
		return (EReference)clientEClass.getEStructuralFeatures().get(8);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getClient_CAppointments() {
		return (EReference)clientEClass.getEStructuralFeatures().get(9);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getDentist() {
		return dentistEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDentist_Name() {
		return (EAttribute)dentistEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDentist_Id() {
		return (EAttribute)dentistEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getDentist_Schedule() {
		return (EReference)dentistEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getSchedule() {
		return scheduleEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getSchedule_Appointments() {
		return (EAttribute)scheduleEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getSchedule_HasAppointments() {
		return (EReference)scheduleEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getAppointment() {
		return appointmentEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getAppointment_Date() {
		return (EAttribute)appointmentEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getAppointment_StartBlock() {
		return (EAttribute)appointmentEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getAppointment_Status() {
		return (EAttribute)appointmentEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getAppointment_HasClients() {
		return (EReference)appointmentEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getAppointment_Services() {
		return (EReference)appointmentEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getService() {
		return serviceEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getService_Name() {
		return (EAttribute)serviceEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getService_BaseCost() {
		return (EAttribute)serviceEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getService_TimeSlotsRequired() {
		return (EAttribute)serviceEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getService_ProductsRequired() {
		return (EReference)serviceEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getProduct() {
		return productEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getProduct_Name() {
		return (EAttribute)productEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getProduct_TreatmentCost() {
		return (EAttribute)productEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getProduct_CustomerCost() {
		return (EAttribute)productEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getProduct_EReference0() {
		return (EReference)productEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getBottledProduct() {
		return bottledProductEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getClientType() {
		return clientTypeEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getAppointmentStatus() {
		return appointmentStatusEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EDataType getHashMap() {
		return hashMapEDataType;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ClinicFactory getClinicFactory() {
		return (ClinicFactory)getEFactoryInstance();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isCreated = false;

	/**
	 * Creates the meta-model objects for the package.  This method is
	 * guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void createPackageContents() {
		if (isCreated) return;
		isCreated = true;

		// Create classes and their features
		dentalClinicEClass = createEClass(DENTAL_CLINIC);
		createEReference(dentalClinicEClass, DENTAL_CLINIC__EREFERENCE0);
		createEReference(dentalClinicEClass, DENTAL_CLINIC__CLIENT_LIST);
		createEReference(dentalClinicEClass, DENTAL_CLINIC__DENTIST_LIST);

		clientEClass = createEClass(CLIENT);
		createEAttribute(clientEClass, CLIENT__NAME);
		createEAttribute(clientEClass, CLIENT__ADDRESS);
		createEAttribute(clientEClass, CLIENT__AGE);
		createEAttribute(clientEClass, CLIENT__DELTA_ID);
		createEAttribute(clientEClass, CLIENT__CLIENT_TYPE);
		createEReference(clientEClass, CLIENT__EREFERENCE0);
		createEReference(clientEClass, CLIENT__EREFERENCE1);
		createEReference(clientEClass, CLIENT__EREFERENCE2);
		createEReference(clientEClass, CLIENT__PREFERRED_DENTIST);
		createEReference(clientEClass, CLIENT__CAPPOINTMENTS);

		dentistEClass = createEClass(DENTIST);
		createEAttribute(dentistEClass, DENTIST__NAME);
		createEAttribute(dentistEClass, DENTIST__ID);
		createEReference(dentistEClass, DENTIST__SCHEDULE);

		scheduleEClass = createEClass(SCHEDULE);
		createEAttribute(scheduleEClass, SCHEDULE__APPOINTMENTS);
		createEReference(scheduleEClass, SCHEDULE__HAS_APPOINTMENTS);

		appointmentEClass = createEClass(APPOINTMENT);
		createEAttribute(appointmentEClass, APPOINTMENT__DATE);
		createEAttribute(appointmentEClass, APPOINTMENT__START_BLOCK);
		createEAttribute(appointmentEClass, APPOINTMENT__STATUS);
		createEReference(appointmentEClass, APPOINTMENT__HAS_CLIENTS);
		createEReference(appointmentEClass, APPOINTMENT__SERVICES);

		serviceEClass = createEClass(SERVICE);
		createEAttribute(serviceEClass, SERVICE__NAME);
		createEAttribute(serviceEClass, SERVICE__BASE_COST);
		createEAttribute(serviceEClass, SERVICE__TIME_SLOTS_REQUIRED);
		createEReference(serviceEClass, SERVICE__PRODUCTS_REQUIRED);

		productEClass = createEClass(PRODUCT);
		createEAttribute(productEClass, PRODUCT__NAME);
		createEAttribute(productEClass, PRODUCT__TREATMENT_COST);
		createEAttribute(productEClass, PRODUCT__CUSTOMER_COST);
		createEReference(productEClass, PRODUCT__EREFERENCE0);

		bottledProductEClass = createEClass(BOTTLED_PRODUCT);

		// Create enums
		clientTypeEEnum = createEEnum(CLIENT_TYPE);
		appointmentStatusEEnum = createEEnum(APPOINTMENT_STATUS);

		// Create data types
		hashMapEDataType = createEDataType(HASH_MAP);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isInitialized = false;

	/**
	 * Complete the initialization of the package and its meta-model.  This
	 * method is guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void initializePackageContents() {
		if (isInitialized) return;
		isInitialized = true;

		// Initialize package
		setName(eNAME);
		setNsPrefix(eNS_PREFIX);
		setNsURI(eNS_URI);

		// Add supertypes to classes
		bottledProductEClass.getESuperTypes().add(this.getProduct());

		// Initialize classes and features; add operations and parameters
		initEClass(dentalClinicEClass, DentalClinic.class, "DentalClinic", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDentalClinic_EReference0(), this.getDentalClinic(), null, "EReference0", null, 0, 1, DentalClinic.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDentalClinic_ClientList(), this.getClient(), null, "clientList", null, 0, -1, DentalClinic.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDentalClinic_DentistList(), this.getDentist(), null, "dentistList", null, 0, -1, DentalClinic.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		EOperation op = addEOperation(dentalClinicEClass, this.getDentist(), "getDentist", 0, 1);
		addEParameter(op, ecorePackage.getEString(), "name", 0, 1);

		op = addEOperation(dentalClinicEClass, this.getClient(), "getClient", 0, 1);
		addEParameter(op, ecorePackage.getEString(), "name", 0, 1);

		initEClass(clientEClass, Client.class, "Client", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getClient_Name(), ecorePackage.getEString(), "name", null, 0, 1, Client.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getClient_Address(), ecorePackage.getEString(), "address", null, 0, 1, Client.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getClient_Age(), ecorePackage.getEInt(), "age", null, 0, 1, Client.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getClient_DeltaID(), ecorePackage.getEInt(), "deltaID", null, 0, 1, Client.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getClient_ClientType(), this.getClientType(), "clientType", null, 0, 1, Client.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getClient_EReference0(), this.getClient(), null, "EReference0", null, 0, 1, Client.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getClient_EReference1(), this.getClient(), null, "EReference1", null, 0, 1, Client.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getClient_EReference2(), this.getClient(), null, "EReference2", null, 0, 1, Client.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getClient_PreferredDentist(), this.getDentist(), null, "preferredDentist", null, 1, 1, Client.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getClient_CAppointments(), this.getAppointment(), null, "cAppointments", null, 0, 1, Client.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		op = addEOperation(clientEClass, null, "makePayment");
		addEParameter(op, this.getDentalClinic(), "clinic", 0, 1);

		initEClass(dentistEClass, Dentist.class, "Dentist", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getDentist_Name(), ecorePackage.getEString(), "name", null, 0, 1, Dentist.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDentist_Id(), ecorePackage.getEInt(), "id", null, 0, 1, Dentist.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDentist_Schedule(), this.getSchedule(), null, "Schedule", null, 1, 1, Dentist.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		op = addEOperation(dentistEClass, ecorePackage.getEBoolean(), "scheduleAppointment", 0, 1);
		addEParameter(op, this.getAppointment(), "app", 0, 1);

		op = addEOperation(dentistEClass, this.getAppointment(), "getAppointment", 0, 1);
		addEParameter(op, ecorePackage.getEDate(), "date", 0, 1);
		addEParameter(op, ecorePackage.getEInt(), "startTime", 0, 1);

		op = addEOperation(dentistEClass, ecorePackage.getEBoolean(), "cancelAppointment", 0, 1);
		addEParameter(op, this.getAppointment(), "app", 0, 1);

		initEClass(scheduleEClass, Schedule.class, "Schedule", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getSchedule_Appointments(), this.getHashMap(), "appointments", null, 0, -1, Schedule.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getSchedule_HasAppointments(), this.getAppointment(), null, "hasAppointments", null, 0, -1, Schedule.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		op = addEOperation(scheduleEClass, ecorePackage.getEBoolean(), "schedule", 0, 1);
		addEParameter(op, this.getAppointment(), "apt", 0, 1);

		op = addEOperation(scheduleEClass, ecorePackage.getEBoolean(), "cancel", 0, 1);
		addEParameter(op, this.getAppointment(), "apt", 0, 1);

		op = addEOperation(scheduleEClass, ecorePackage.getEBoolean(), "isFree", 0, 1);
		addEParameter(op, ecorePackage.getEDate(), "date", 0, 1);
		addEParameter(op, ecorePackage.getEInt(), "startTime", 0, 1);
		addEParameter(op, ecorePackage.getEInt(), "endTime", 0, 1);

		initEClass(appointmentEClass, Appointment.class, "Appointment", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getAppointment_Date(), ecorePackage.getEDate(), "date", null, 0, 1, Appointment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getAppointment_StartBlock(), ecorePackage.getEInt(), "startBlock", null, 0, 1, Appointment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getAppointment_Status(), this.getAppointmentStatus(), "status", null, 0, 1, Appointment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getAppointment_HasClients(), this.getClient(), null, "hasClients", null, 1, -1, Appointment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getAppointment_Services(), this.getService(), null, "services", null, 1, -1, Appointment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		addEOperation(appointmentEClass, ecorePackage.getEInt(), "getCost", 0, 1);

		addEOperation(appointmentEClass, ecorePackage.getEBoolean(), "cancel", 0, 1);

		addEOperation(appointmentEClass, ecorePackage.getEInt(), "getTimeLength", 0, 1);

		initEClass(serviceEClass, Service.class, "Service", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getService_Name(), ecorePackage.getEString(), "name", null, 0, 1, Service.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getService_BaseCost(), ecorePackage.getEInt(), "baseCost", null, 0, 1, Service.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getService_TimeSlotsRequired(), ecorePackage.getEInt(), "timeSlotsRequired", null, 0, 1, Service.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getService_ProductsRequired(), this.getProduct(), null, "productsRequired", null, 0, -1, Service.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		addEOperation(serviceEClass, ecorePackage.getEInt(), "getCost", 0, 1);

		addEOperation(serviceEClass, ecorePackage.getEInt(), "getTime", 0, 1);

		initEClass(productEClass, Product.class, "Product", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getProduct_Name(), ecorePackage.getEString(), "name", null, 0, 1, Product.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getProduct_TreatmentCost(), ecorePackage.getEInt(), "treatmentCost", null, 0, 1, Product.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getProduct_CustomerCost(), ecorePackage.getEInt(), "customerCost", null, 0, 1, Product.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getProduct_EReference0(), this.getBottledProduct(), null, "EReference0", null, 0, 1, Product.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(bottledProductEClass, BottledProduct.class, "BottledProduct", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		op = addEOperation(bottledProductEClass, null, "BottledProduct");
		addEParameter(op, ecorePackage.getEString(), "name", 0, 1);
		addEParameter(op, ecorePackage.getEInt(), "treatmentCost", 0, 1);
		addEParameter(op, ecorePackage.getEInt(), "bottletCost", 0, 1);

		// Initialize enums and add enum literals
		initEEnum(clientTypeEEnum, ClientType.class, "ClientType");
		addEEnumLiteral(clientTypeEEnum, ClientType.DELTACARE_LITERAL);
		addEEnumLiteral(clientTypeEEnum, ClientType.PRIVATE_LITERAL);
		addEEnumLiteral(clientTypeEEnum, ClientType.INACTIVE_LITERAL);

		initEEnum(appointmentStatusEEnum, AppointmentStatus.class, "AppointmentStatus");
		addEEnumLiteral(appointmentStatusEEnum, AppointmentStatus.ACTIVE_LITERAL);
		addEEnumLiteral(appointmentStatusEEnum, AppointmentStatus.PAST_LITERAL);
		addEEnumLiteral(appointmentStatusEEnum, AppointmentStatus.CANCELLED_LITERAL);

		// Initialize data types
		initEDataType(hashMapEDataType, HashMap.class, "HashMap", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);

		// Create resource
		createResource(eNS_URI);
	}

} //ClinicPackageImpl
